#ifndef RENDERIZADOR_H
#define RENDERIZADOR_H

#include <iostream>
#include <stdlib.h>

#include "basicas/camera.h"
#include "basicas/ponto.h"
#include "basicas/vertice.h"
#include "basicas/triangulo.h"
#include "basicas/cor.h"
#include "arquivo/arquivo.h"
#include "tela.h"
//#include <vector>

#define LARGURA_TELA 800
#define ALTURA_TELA 600
#define GOURAUD true
#define PHONG false
//#define DBL_MAX 1.7976931348623158e+308 /* max value */
// vamor maximo de distancia que um ponto pode estar da camera, acima disto nao eh pintada
#define FUNDO_FRUSTRUM 1500

using namespace std;

typedef struct normalTemp{
    Ponto normal;
    int count;
}normalTemp;

class Renderizador
{
private:
    // variaveis internas
    Objeto *objeto;
    Iluminacao *iluminacao;
    Camera *camera;
    Vertice *repositorioVerticesEmCoordVista;
    Vertice *repositorioVerticesEmCoordPontoL;
    Ponto fonteDeLuzEmCoordVista;

    bool sombra;
    bool shading;

    float zbuffer [LARGURA_TELA][ALTURA_TELA];
    float **depthBuffer ;

    // funcoes internas
    //void limparBufferTela();
    bool consultarDepthBuffer(Ponto coordenadasBaricentricasPontoTemp, Vertice p1, Vertice p2, Vertice p3);
    void transformarSistemaCoordenadas (Vertice *repositorioFinal, Camera* base, bool fonteLTambem);
    Vertice projetarPonto(Vertice p1, bool depthMap);
    void calculaNormaisVertices();
    void inicializaDepthBuffer();
    void inicializaZBuffer();
    void projetarVertices(Tela *tela,bool depthMap);
    Cor calcularIluminacao(Vertice ponto);
    void pintar(Ponto coefBaricentricos, Ponto ponto2D,Vertice vertice1, Vertice vertice2, Vertice vertice3, Tela *tela, bool estaNaSombra);
    //Cor bufferTela [LARGURA_TELA][ALTURA_TELA];
     void ordenaVertices(Vertice p1, Vertice p2, Vertice p3,Vertice* retorno);
     bool ehTriangulo(Vertice v1, Vertice v2, Vertice v3);

public:
    Renderizador(Objeto *objeto, Iluminacao *iluminacao, Camera *camera);
    ~Renderizador();
    void atualizar(Tela *tela); // funcao que manda atualizar parametros e recebe como resposta um array com os pixels da tela e suas cores
    bool getShading();
    void setShading(bool shading);
    void setSombra(bool ligada);
    void gerarNovoDepthBuffer();
};

#endif // RENDERIZADOR_H
